package com.ty.service.impl;

import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ObjectUtil;
import com.ty.dao.InventoryBatchDao;
import com.ty.dao.InventoryDao;
import com.ty.dao.IoItemDao;
import com.ty.dao.IoMasterDao;
import com.ty.dto.InventoryChangSource;
import com.ty.entity.*;
import com.ty.service.IInvertoryOptionService;
import com.ty.service.IoMasterService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

@Service("IN")
public class InServiceImpl implements IInvertoryOptionService {
    @Autowired
    private IoItemDao ioItemDao;
    @Autowired
    private InventoryDao inventoryDao;
    @Autowired
    private InventoryBatchDao inventoryBatchDao;

    @Override
    /** 添加事务  进行 库存表 和批次表 一同处理*/
    //有没有改变过事物的处理级别？  1.没有并发 2. 串行执行,保证原子性,一定不会出现问题
    @Transactional(isolation = Isolation.SERIALIZABLE)
    public void option(InventoryChangSource source) {
        //入库的业务逻辑
        /**   1. 找到入库单id  */
        String ioId = source.getRefId();
        /** 2.找到入库单 */
        IoItemQuery ioItemQuery = new IoItemQuery().setIoid(ioId);
        List<IoItem> ioItems = ioItemDao.select(ioItemQuery);
        /** 3.组装数据 */
        for (IoItem ioItem :ioItems){

            InventoryQuery inventoryQuery = InventoryQuery.builder().id(ioItem.getProductid()).build();

            List<Inventory> inventoryList = inventoryDao.select(inventoryQuery);
            /** 4. 般判当前 商品是否在库房表 */
            if (ObjectUtil.isNotEmpty(inventoryList)){
                /** 5. 如果存在 只更新数量和版本号 */
                Inventory inventory0 = inventoryList.get(0);
                inventoryDao.upadeteQty(ioItem.getProductid(), ioItem.getQty());
            } else {
                /**  构建者模式 */
                /** 6. 如果不存在 直接插入 */
                Inventory inventory1 =  Inventory.builder().id(ioItem.getProductid()).productname(ioItem.getProductname())
                        .qty(ioItem.getQty()).salecount(0).version(0).build();
                inventoryDao.insert(inventory1);
            }
            //批次
            String batchid = "B"+ioItem.getProductid()+"-"+ DateUtil.format(ioItem.getProductiondate().atStartOfDay(),"yyyyMMdd");
            InventoryBatchQuery batchQuery = InventoryBatchQuery.builder().batchid(batchid).build();
            List<InventoryBatch> batchList = inventoryBatchDao.select(batchQuery);
            /**  7.判断该批次是否在批次表*/
            if (ObjectUtil.isNotEmpty(batchList)){
                /** 8. 如果存在 只更新数量 */
                inventoryBatchDao.updateBatchQty(batchid, ioItem.getQty());

            }else {
                /** 9. 如果不存在 直接插入 */
                InventoryBatch inventoryBatch = InventoryBatch.builder()
                        .batchid(batchid)
                        .productid(ioItem.getProductid())
                        .productname(ioItem.getProductname())
                        .productiondate(ioItem.getProductiondate())
                        .biref(ioItem.getBrief())
                        .expirydate(ioItem.getExpirydate())
                        .shelfid(ioItem.getShelfid())
                        .shelflife(ioItem.getShelflife())
                        .build();
                inventoryBatchDao.insert(inventoryBatch);
            }


        }
    }
}
